<%@ page pageEncoding="utf-8" contentType="text/html; charset=utf-8"%>

<html>
<head>
<title>主页面</title>
<!-- ExtJS -->
<link rel="stylesheet" type="text/css"
	href="<%=request.getContextPath()%>/public/extjs/resources/css/ext-all.css" />
<script type="text/javascript"
	src="<%=request.getContextPath()%>/public/extjs/ext-all.js"></script><script type="text/javascript"	src="<%=request.getContextPath()%>/public/include/js/component.js"></script><script type="text/javascript" src="<%=request.getContextPath()%>/public/include/js/api/appdeal.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/public/extjs/locale/ext-lang-zh_CN.js"></script>
<script type="text/javascript"	src="<%=request.getContextPath()%>/public/include/js/socket.io.js"></script>
<!-- GC -->

</head>
<body>

</body>
<script language="javascript">
	Ext.require( [ '*' ]);
	Ext.onReady( function() {
		var cw;

		
		var framePanel = Ext.create('Ext.panel.Panel',{
				region :'center',
				activeItem :1,
				id :'mainPanel',
				enableTabScroll :true,
				height :550,
				border :false,
				frame :false,
				layout:'card',				
				items : [ {
					title :"展示界面",
					listeners : {
						activate : function() {
							//Ext.getCmp('centerPanel').setTitle('我的工作台');
						}
					},
					html :"<iframe name='showFrame'  src='<%=request.getContextPath()%>/mainFrame.do?action=showShowFrame' scrolling='auto' frameborder='0' width='100%' height='100%' ></iframe>"
				},{
					//title :"系统界面22",
					border:false,
					frame:false,
					listeners : {
						activate : function() {
							//Ext.getCmp('centerPanel').setTitle('我的工作台');
						}
					},
					html :"<iframe name='sysFrame'  src='<%=request.getContextPath()%>/mainFrame.do?action=showSysFrame' scrolling='auto' frameborder='0' width='100%' height='100%' ></iframe>"
				},{
					border:false,
					frame:false,
					listeners : {
						activate : function() {
							//Ext.getCmp('centerPanel').setTitle('我的工作台');
						}
					},
					html :"<iframe name='menuFrame'  src='<%=request.getContextPath()%>/mainFrame.do?action=showMenuFrame' scrolling='auto' frameborder='0' width='100%' height='100%' ></iframe>"
				} ]
		});

		window.f_showShowFrame = function(){
			//frameTabs.setActiveTab(0);
			Ext.getCmp('mainPanel').getLayout().setActiveItem(0);
		}
		
		window.f_showSysFrame = function(){
			//frameTabs.setActiveTab(1);
			Ext.getCmp('mainPanel').getLayout().setActiveItem(1);
		}
		
		window.f_showMenuFrame = function(){
			//frameTabs.setActiveTab(1);
			Ext.getCmp('mainPanel').getLayout().setActiveItem(2);
		}
		var viewport = Ext.create('Ext.Viewport', {
				layout : {
					type :'border',
					padding :5
				},
				defaults : {
					split :true
				},
				items : [ {
					region :'north',
					collapsible :false,
					//title :'一体化系统w',
					split :true,
					height :70,
					minHeight :30,
					html :"<iframe name='topFrame'  src='<%=request.getContextPath()%>/mainFrame.do?action=showTopFrame' scrolling='auto' frameborder='0' width='100%' height='100%' ></iframe>"
				},framePanel
				]
			});
	});
var hwin=null;
var html;
function f_addTab(url,sysrightItemName,itemCode){
	frames['sysFrame'].addTab(url,sysrightItemName,itemCode);
}

function f_menu(){
	html="";
	Ext.Ajax.request({
		url : "<%=request.getContextPath()%>/sysrightMenu.do?action=getValidCommonMenu",
		method : "POST",
		success : function(response) {//response
			var jsonArray = Ext.decode(response.responseText).ROOT;
			if(jsonArray!=null&&jsonArray!=''){
				html="<table  border='0' cellspacing='0' width=360 height:170; cellpadding='0'><tr><td  width=2 ></td><td>";
				html+="<div style='cursor:hand;background:#FEFDF4;width:490;height:270;OVERFLOW-X:auto;OVERFLOW:scroll'>";
				html+="<table  border='0' width='98%' cellspacing='5' cellpadding='5' STYLE='margin-left:5px;margin-top:5px;FONT-SIZE: 10pt;'>";
				html+="<style type='text/css'>a.ah:visited{color:blue}a.ah:hover{color:red}a.ah:active {color:purple}</style>";
				//html+="<table style='font-size:12px;width:100%' border='0px'>";
				for(var i=0;i<jsonArray.length;i++){
					var json=jsonArray[i];
					if(i%4==0){
						html+="<tr>";
					}
					var itemName=json.rightItemName;
					if(json.itemName!=null&&json.itemName!=''&&json.itemName!='null') itemName=json.itemName;
					html+="<td width='25%'><a href=# class=ah style='text-decoration: none;' onclick='f_addTab(\"/"+json.functionEntity+"\",\""+json.rightItemName+"\",\""+json.itemCode+"\")' >"+itemName+"</a></td>";
					if(i%4==3) html+="</tr>";
				}
				var nntag = 4 - (jsonArray.length % 4);
				while (nntag >= 0){
					html+="<td></td>";				
					if(nntag == 0){
						html+="</tr>";
					}
					nntag--;
				}
				html+="</table></div>";
				html+="</td><td width=190 ></td></tr>";
				html+="<tr><td colspan=3>";
				html+="<table  border='0' cellspacing='0' width=496><tr height=15><td width=7 ></td>";
				html+="<td ></td>";
				html+="<td width=9 ></td></tr></table></td></tr></table>";
				f_showitem();
			}
		},
		failure : function() {
			Ext.Msg.alert("错误", "与后台联系的时候出现了问题");
		}
	});
}

function f_showitem(){
		var renderBase = Ext.getBody();
		var scrHeight = 305;
		var scrWidth = 500;
		var   lefter   = document.body.clientWidth-550;//1080;screen.width   历史浏览菜单的弹出位置的Y坐标屏幕宽度改成页面宽度 
		var   topper   = 80;
		var num = Math.random();
		hwin = Ext.create('Ext.window.Window', {
			title : '我的常用菜单',
			renderTo : renderBase,
	 	    height: scrHeight,
	 	    width: scrWidth,
	 	    header: false,
	 	    //modal : true,
	 	    plain:true,
	 	    x : lefter,
	 	    y : topper,
	 	    layout: 'fit',
	 	    resizable : false,
	 	    border :false,
	 	    bodyBorder : false,
	 	    frame:false,
	 	    //closable : false,
	 	    autoEl: {
	        	tag: 'div',
	        	tabIndex: 0
	       	},
	 	    items: {
	 	        //xtype: 'panel',
	 	        //html : '<iframe name="commonMenu" id="commonMenu" src="/basecore/sysrightMenu.do?action=showCommonMenu" scrolling="auto" frameborder="0" width="100%" height="100%" ></iframe>'
	 	        html : html
	 	    }
	 	});
	hwin.show();
}
function f_close(){
	hwin.close();
}
//window.onclick = f_close;
</script>

<script type="text/javascript">
// webSocket
var array=new Array();
var ws = null;
var userUUID = ""; // 当前登录用户

// 获取当前系统的URL，作为WebSocket的服务URL
function getWsRealPath(){	
    //获取当前网址，如： http://localhost:8083/myproj/view/my.jsp 
    var curWwwPath=window.document.location.href;
    //alert(curWwwPath);
    //获取主机地址之后的目录，如： myproj/view/my.jsp 
    var pathName=window.document.location.pathname; 
    var pos=curWwwPath.indexOf(pathName); 
    //获取主机地址，如： http://localhost:8083 
    var localhostPaht=curWwwPath.substring(0,pos); 
    //获取带"/"的项目名，如：/myproj 
    var projectName=pathName.substring(0,pathName.substr(1).indexOf('/')+1); 
  
	//得到了 http://localhost:8083/myproj 
    var realPath=localhostPaht+projectName;
    //alert(realPath);
    realPath = "ws"+realPath.substring(4); 
    return realPath;
}
function getSocketIp(){	
    //获取当前网址，如： http://localhost:8083/myproj/view/my.jsp 
    var curWwwPath=window.document.location.href;
    //alert(curWwwPath);
    //获取主机地址之后的目录，如： myproj/view/my.jsp 
    var pathName=window.document.location.pathname; 
    var pos=curWwwPath.indexOf(pathName); 
    //获取主机地址，如： http://localhost:8083 
    var localhostPaht=curWwwPath.substring(0,pos); 
    //获取带"/"的项目名，如：/myproj 
    var projectName=pathName.substring(0,pathName.substr(1).indexOf('/')+1); 
  
	//得到了 http://localhost:8083/myproj 
    var realPath=localhostPaht+projectName;
    //alert(realPath);
    //realPath = "ws"+realPath.substring(4);
    var ipPort = "";
    Ext.Ajax.request({
	    url: realPath + '/sysMobile.do?action=getSsoServerInfo',
	    method: 'post',
	    async :  false,//同步请求数据
	    success: function (response, options) {
	    	var obj = JSON.parse(response.responseText);
	    	ipPort = obj.data.client_url_imsocketio;
	    },
	    failure: function (response, options) {
	        Ext.MessageBox.alert('失败', '请求超时或网络故障,错误编号：' + response.status);
	    }
	});
    return ipPort;
}
// 启动WebSocket，注册用户
function startWebSocket(){
	//alert(getWsRealPath()+"/WebSocketServer.do?uuid=111111");
	// TODO:webSocket服务如何获取，取当前系统的
	var uuid="<%=((com.ysxn.sysright.model.VoSysrightRcAccounts)request.getSession().getAttribute("UserView")).getUuid()%>";
	var ip = getSocketIp();
	if(ip == null || ip == "" || ip == "null" || ip == undefined) return;
	ws =  io.connect(ip + '?uuid='+uuid);
	if(popIM_Win==null)
		popWin_init();
	//监听名为onMsg的事件，这与服务端推送的那个事件名称必须一致  
    ws.on("onMsg", function(data){
    	handleMessageData(data);
    });
	
	//ws  = new WebSocket(getWsRealPath()+"/WebSocketServer?uuid="+uuid);
	/* try{
		ws  = new ReconnectingWebSocket(getWsRealPath()+"/WebSocketServer?uuid="+uuid);
		ws.onopen = function(){
			if(popIM_Win==null)
				popWin_init();
			console.log("success open");
		};
		
		ws.onmessage = function(event){
			console.log("RECEIVE:"+event.data);
			handleMessageData(event.data);
		};
		
		ws.onclose = function (event){
			array=new Array();
			console.log("Client notified socket has closed！");
		};
		
		ws.onerror = function(event){
			console.log("WebSocketError!");
		};
	}catch(e){
	
	} */
}
// 消息处理
function handleMessageData(data){
	var arr=JSON.parse(data);
	if(arr[0]=='CLOSE'){//关闭消息
		Ext.each(arr[1], function(item){
			var i=0;
			Ext.each(array, function(it){
				if(it.uuid==item.uuid){
					array.splice(i,1);
					return false;
				}
				i++;
			});
		});
		initPopIMData();
	}else{//添加消息
		array=arr[1].concat(array);
		initPopIMData();
	}
}
function initPopIMData(){
	if(array==null||array.length==0) {
		popIM_Win.hide();
		//popIM_Win.update("");
		return ;
	}
	var html="<table style='font-size:12px;width:100%' border='1px'><tr><td>提醒内容</td><td>提醒时间</td><td><input name='all' type='checkbox' value='ALL' onclick='if(this.checked){closeAllIM(\"\")}'/></td></tr>";
	var i=0;
	Ext.each(array, function(item){
    	html+="<tr><td><a href='javascript:void(0);' style='color:black;' onclick='showIM(\""+item.awakeUrl+"\",\""+item.awakeServer+"\",\""+item.idBusiness+"\")' >"+item.awakeContent+"</a></td><td>"+item.awakeTime+"</td><td><input name='all' type='checkbox' value='"+i+"' onclick='if(this.checked){closeIM(\""+i+"\",\""+item.uuid+"\")}'/></td></tr>";
    	i++;
	});
	html+="<tr align='right'><td colspan='3'><a href='javascript:void(0);' style='color:black;' onclick='showAllIM()'>更多>></a></td></tr></table>";
	popIM_Win.update(html);
	popIM_Win.show();
}
function showIM(url,awakeServer,idBusiness){
	var ip="";
	var port="";
	var sys='<%=request.getContextPath()%>';
	var host=window.location.host;
	if(host.indexOf(":")>-1){
		var hostArray=host.split(":");
		ip=hostArray[0];
		port=hostArray[1];
	}
	var uuid="<%=((com.ysxn.sysright.model.VoSysrightRcAccounts)request.getSession().getAttribute("UserView")).getUuid()%>";
	Ext.Ajax.request({
		url : "<%=request.getContextPath()%>/ntcawaketask.do?action=getAwakeServerIP",
		params : {
			awakeServer : awakeServer
		},
		method : "POST",
		success : function(response) {//response
			var result = Ext.decode(response.responseText);
			if(url=='WORKFLOW')
				url=result.result+"/jbpmWorkFlow_showAwakeTask.action?createUser="+uuid+"&IP="+ip+"&PORT="+port+"&taskId="+idBusiness;
			else
				url=result.result+url;
			frames['sysFrame'].addTab(url,"提醒查看",'imTask');
		},
		failure : function() {
			Ext.Msg.alert("错误", "与后台联系的时候出现了问题");
		}
	});
}
function showAllIM(){
	var url = "/ntcawaketask.do?action=initList";
	frames['sysFrame'].addTab(url,"提醒列表",'imList');
}
function closeAllIM(){
	Ext.Ajax.request({
		url : "<%=request.getContextPath()%>/ntcawaketask.do?action=closeAllIM",
		params : {
			data : ''
		},
		method : "POST",
		success : function(response) {//response
			var result = Ext.decode(response.responseText);
			if(result.result!='error')
				closePopIM('ALL');
			else
				Ext.Msg.alert("错误", "关闭消息时出现了问题");
		},
		failure : function() {
			Ext.Msg.alert("错误", "与后台联系的时候出现了问题");
		}
	});
}
function closeIM(index,uuid){
	var json = [];
	if(index=='ALL'){
		json=array;
	}else{
		json.push(array[index]);
	}
	Ext.Ajax.request({
		url : "<%=request.getContextPath()%>/ntcawaketask.do?action=closeIM",
		params : {
			data : Ext.JSON.encode(json)
		},
		method : "POST",
		success : function(response) {//response
			var result = Ext.decode(response.responseText);
			if(result.result!='error')
				closePopIM(index,uuid);
			else
				Ext.Msg.alert("错误", "关闭消息时出现了问题");
		},
		failure : function() {
			Ext.Msg.alert("错误", "与后台联系的时候出现了问题");
		}
	});
}
function closePopIM(index,uuid){
	if(index=='ALL'){
		array=new Array();
		initPopIMData();
	}else{
		var obj=array[index];
		if(obj.uuid!=uuid) return ;
		array.splice(index,1);
		initPopIMData();
	}
}
</script>

<script type="text/javascript">

var popIM_Win = null;
var popWin_init;


Ext.onReady(function() {
	// 准备popWin
	popWin_init=function(){
		popIM_Win = new Ext.Window({
			width:226,  
	        height:160,  
	        layout:'fit',
	        modal : false,  
	        plain: true,
	        autoScroll : true,
	        shadow:false, //去除阴影  
	        draggable:false, //默认不可拖拽  
	        resizable:false,  
	        closable: true,  
	        closeAction:'hide', //默认关闭为隐藏 
	        autoHide:false, //15秒后自动隐藏，false则不自动隐藏 
/* 	        autoEl: {
	        	tag: 'div',
	        	tabIndex: 0
	       	}, */
	        title : '消息提醒',
	        //html : '',
	        initComponent: function(conf){
	          	Ext.Window.superclass.initComponent.call(this, conf);  
	            this.initPosition(true);  
	        },
	        initEvents: function() {
	        	//alert(33);
	        	Ext.Window.superclass.initEvents.call(this);  
	             //自动隐藏  
	             if(false !== this.autoHide){  
	                 var task = new Ext.util.DelayedTask(this.hide, this), second = (parseInt(this.autoHide) || 3) * 1000;  
	                 this.on('beforeshow', function(self) {  
	                     task.delay(second);  
	                 });  
	             }  
	             this.on('beforeshow', this.showTips);  
	             this.on('beforehide', this.hideTips);
	             //window大小改变时，重新设置坐标  
	             Ext.EventManager.onWindowResize(this.initPosition, this);
	             //window移动滚动条时，重新设置坐标  
	             Ext.EventManager.on(window, 'scroll', this.initPosition, this);
	         },  
	         //参数flag为true时强制更新位置  
	         initPosition: function(flag) {
	          //不可见时，不调整坐标
	             if(true !== flag && this.hidden){  
	                 return false;  
	             }  
	             //var doc = document, bd = (doc.body || doc.documentElement);
	             //var bd = Ext.getBody();
	             var bd = Ext.getCmp("mainPanel");
	             //Ext取可视范围宽高(与上面方法取的值相同), 加上滚动坐标
	             //alert(bd.el.getAnchorXY('r')[1]);
	             var left = bd.el.getAnchorXY('r')[0] -4-this.width;  
	             var top = bd.el.getAnchorXY('b')[1] -4-this.height;  
	             this.setPosition(left, top);  
	         },  
	         showTips: function() {  
	             var self = this;  
	             if(!self.hidden){return false;}  
	             //初始化坐标
	             //alert(1133);
	             self.initPosition(true);   
	             self.el.slideIn('b', {  
	                 callback: function() {   
	                //显示完成后,手动触发show事件,并将hidden属性设置false,否则将不能触发hide事件   
	                     self.fireEvent('show', self);  
	                     self.hidden = false;  
	                 }  
	             });
	             //不执行默认的show
	             return false;   
	         },  
	         hideTips: function() {
	             var self = this;
	             if(self.hidden){return false;}  
	             self.el.slideOut('b', {
	                 callback: function() {
	                     //渐隐动作执行完成时,手动触发hide事件,并将hidden属性设置true
	                     self.fireEvent('hide', self);
	                     self.hidden = true;
	                 }
	             });
	             //不执行默认的hide
	             return false; 
	         }
	     });
	}
	// 启动WebSocket接收数据	
	startWebSocket();
});

</script>
<script language="javascript">
var num = 0; //模态窗口打开个数，整体计数器。
var result = new Object();
var lastId = new Array(); //最近一次set产生或用到的ID在最后（按照堆栈使用）

/**
 * 保存临时结果，各业务调用
 * @param resultId 存入、取出都要用到的key，可以为null，为null时方法随机生成一个key返回。
 * @param val 存储值
 * @return resultId
 */
function setResult(resultId, val){
	if(resultId==null){
		resultId = "KEY_" + getRandom();
	}
	lastId[resultId] = lastId.length; //这两句：既存储了 resultId 又存储了 resultId 所在索引 
	lastId.push(resultId);
	result[resultId] = val;
	return resultId;
}

/**
 * 获取临时结果，各业务调用
 * @param resultId 存入、取出都要用到的key
 * @param isPopValue 布尔值，为true时表示本方法一旦被执行一次，则resultId标志的值将从缓存数组清除，
 * 	                                   默认值跟resultId有关，如果resultId为null，则默认true，如果resultId有值则默认false
 * @return 根据resultId取出的对应值
 */
function getResult(resultId, isPopValue){
	var rtn;
	if(resultId==null){
		if(isPopValue==null){
			isPopValue = true;
		}
		if(lastId.length>0){
			if(isPopValue){
				resultId = lastId.pop();
				delete lastId[resultId];
			}else{
				resultId = lastId[lastId.length - 1];
			}
		}
	}else{
		if(isPopValue==null){
			isPopValue = false;
		}
	}
	if((resultId!=null) && (resultId in result)){
		rtn = result[resultId];
		if(isPopValue){
			result[resultId] = null;
			delete result[resultId];
		}
	}else{
		rtn = null;
	}
	return rtn;
}

/**
 * 清除临时结果，各业务调用
 * @param resultId 可选，如果有值则表示仅清除这个key的value，否则（null）表示清除全部。
 * @return void
 */
function clearResult(resultId){
	if(resultId==null){
		result = new Object();
		lastId = new Array();
	}else{
		result[resultId] = null;
		delete result[resultId];
		var idx = lastId[resultId];
		delete lastId[resultId];
		lastId.splice(idx,1);
	}
}

/**
 * 各业务调用，提供模态窗口（顶层窗口锁定，避免子窗口调用后至锁定调用窗口），当窗口第一层DIV处于焦点时（可通过点击标题栏取得），存在热键“F8：调用子页面returnByKeyEvent方法（如果存在）”、“ESC：直接退出”
 * @param url 窗口显示内容的超链接，不要包括工程名及 / ，正确的格式类似：xxxx.do?action=xxxxx&xx=xx
 *						注意：新的URL为了方便获取返回值，为 URL 增加了参数 codeIndex，也就是原始URL里要避免使用此名称作为参数
 * @param title 窗口标题
 * @param width 窗口宽度（像素）
 * @param height 窗口高度（像素）
 * @param callback 回调对象，里面需要定义callback方法用于窗口关闭后执行代码
 *                 2015-11-18增加：clearResult属性，布尔值，为真时一旦弹窗就先清除使用这个URL作为KEY的结果对象。
 * @return handle of the window 返回模态窗体的句柄，用于被动关闭。
 */
var hwinarr = new Array();
var winParams = null;
function getWinParams(){// 给模拟模态窗口传参数 Add by zonghuah at 2015-11-06
	return winParams;
}
function showModalWin(url, title, width, height, callback, params){
	winParams = params;
	if(typeof(width)=="object" && height==null){ //如果传入的是窗口大小常量对象
		height = width.HEIGHT;
		width = width.WIDTH;
	}
	var clearResult = true;
	if(callback!=null){
		if(clearResult in callback){
			clearResult = callback.clearResult;
		}
	}
	if(clearResult){
		top.clearResult(url);
	}
	winId = "WIN_" + getRandom();
 	var hwin = Ext.create('Ext.window.Window', {
 		id : winId,
 	    title: title,
 	    height: height,
 	    width: width,
 	    modal : true,
 	    layout: 'fit',
 	    resizable : false,
 	    border :false,
 	    bodyBorder : false,
 	   	autoEl: {
        	tag: 'div',
        	tabIndex: 0
       	},
 	    items: {
 	        xtype: 'panel',
 	        html : '<iframe name="SysModalWin' + num + '" id="SysModalWin' + num + '" src="<%=request.getContextPath()%>/' + url + (url.indexOf('.htm')<0?((url.indexOf('?')<0?'?':'&') + 'codeIndex=' + num):'') + '" scrolling="auto" frameborder="0" width="100%" height="100%" ></iframe>'
 	    },
 	   	listeners : {
	 	    destroy : function(){
	 	    	if(callback!=null){
	 	    		callback.callback();
	 	    	}
	 	    },
	 	    show : function(winObj, eOpts){
	 	    	if(getExplorerId().custom=="FIREFOX" || getExplorerId().custom=="IE"){
	 	    		var ifm = winObj.items.getAt(0).getEl().dom.getElementsByTagName("IFRAME")[0];
	 	    		ifm.contentWindow.location.href = ifm.src;
	 	    	}
	 	   	}
 	   	}
 	});
 	
 	hwinarr[num] = hwin; //存句柄
 	hwin["CODE_INDEX"] = num; //整体窗口数组索引
 	hwin["CODE_URL"] = url; //存链接
 	num++;
 	hwin.show();
 	
 	var km = hwin.getKeyMap();
    km.on(Ext.EventObject.F8, function(key, ev){ //添加热键
    	var ifm = hwin.items.getAt(0).getEl().dom.getElementsByTagName("IFRAME")[0];
    	if(typeof(ifm.contentWindow.returnByKeyEvent)=="function"){
    		ifm.contentWindow.returnByKeyEvent();
    	}
    	ev.stopEvent();
		return false;
    }, hwin);
    
 	return hwin;
}

/**
 * 获取当前全部通过本窗口打开的Ext窗体的对象数组
 * @return hwinarr 窗体对象数组
 */
function getWinHandles(){
	return hwinarr;
}

/**
 * 清除全部由本窗体打开的Ext窗口及数组
 * @param isFast 是否快速清除，快速清除不针对每一个窗口对象进行关闭。
 * @return void
 */
function clearWinHandles(isFast){
	if(isFast==null){
		isFast = true;
	}
	if(!isFast){
		for(var i=0; i<num; i++){
			if(hwinarr[i]!=null){
				try{
					hwinarr[i].close();
				}catch(e){}
				hwinarr[i] = null;
			}
		}
	}
	hwinarr = new Array();
	num = 0;
}
/**
 * 关闭Ext模态窗口
 * @param hwin 窗口对象，可以为null，为null时自动关闭本窗口打开的最后一个Ext窗口对象。
 * @return (true OR false) 关闭动作是否成功
 */
function closeWindow(hwin){
	var rtn = true;
	if(hwin==null){
		if(hwinarr[num-1]!=null){
			try{
				hwinarr[num-1].close();
			}catch(e){
				rtn = false;
			}
			hwinarr[num-1] = null;
		}
	}else{
		try{
			hwin.close();
		}catch(e){
			rtn = false;
		}
	}
	return rtn;
}

/**
 * 弹出消息（仅确定按钮），为了方便锁定，封装Ext方法到根页面
 * @param title 消息窗口标题
 * @param msg 消息窗口内容
 * @param callback 消息窗口关闭后触发的回调函数
 * @return 弹窗对象（Ext.window.MessageBox）
 */
function showMsg(title, msg, callback){
	return Ext.Msg.alert(title, msg, callback);
}

/**
 * 确认消息（确定、取消按钮），为了方便锁定，封装Ext方法到根页面
 * @param title 确认窗口标题
 * @param msg 确认窗口内容
 * @param callback 确认窗口关闭后触发的回调函数
 * @return 弹窗对象（Ext.window.MessageBox）
 */
function showConfirm(title, msg, callback){
	return Ext.Msg.confirm(title, msg, callback);
}

/**
 * 设置状态结果文字（机组及专业所在窗口，右侧）
 */
function setStatus(title){
	var rtn = true;
	try{
		if(typeof(standardFrame.setInformation)=="function"){
			standardFrame.setInformation(title);
		}else{
			rtn = false;
		}
	}catch(e){
		if(typeof(sysFrame.setInformation)=="function"){
			sysFrame.setInformation(title);
		}else{
			rtn = false;
		}
	}
	return rtn;
}
<%-- ============================================================= --%>

/**
 * 获取自定义浏览器对象，主要用到里面的浏览器类型值
 * @return Array : [name, version, code, agent, custom] （浏览器名称、浏览器版本、浏览器编码、浏览器标志字符串、自定义浏览器类型：IE、FIREFOX、CHROME、UNKNOWN）
 */
function getExplorerId(){
	var rtn = new Array();
	
	rtn[rtn.length] = navigator.appName;
	rtn["name"] = navigator.appName;
	rtn[rtn.length] = navigator.appVersion;
	rtn["version"] = navigator.appVersion;
	rtn[rtn.length] = navigator.appCodeName;
	rtn["code"] = navigator.appCodeName;
	rtn[rtn.length] = navigator.userAgent;
	rtn["agent"] = navigator.userAgent;
	
	if(rtn["agent"].indexOf("MSIE")>=0){ //IE
		rtn["custom"] = "IE";
	}else if(rtn["agent"].indexOf("Firefox")>=0){ //FIREFOX
		rtn["custom"] = "FIREFOX";
	}else if(rtn["agent"].indexOf("Chrome")>=0){ //CHROME
		rtn["custom"] = "CHROME";
	}else{ //UNKNOWN
		rtn["custom"] = "UNKNOWN";
	}
	rtn[rtn.length] = rtn["custom"];
	
	return rtn;
}

/**
 * 返回不绝对唯一的随机值，对于人工操作的需求基本够用。
 * @return 25位长度随机字符串（前缀补0的15位时间 + 1位连接符 + 9位随机数）
 */
function getRandom(){
	var rtn = "00" + (new Date()).getTime();
	rtn = rtn.substring(rtn.length - 15);
	rtn += "_" + Math.round(100000000 * Math.random()); //这个随机不重复的办法显然不是绝对的，但对于一次网站访问打开的时间段内，重复可能性小，就没再深究。
	return rtn;
}

/**
 * 获取顶层遮罩对象  
 * @param type 参数 type 控制遮罩提示文字  
 * @return 返回值为遮罩对象，业务层通过返回对象的.show()和.hide()方法，控制遮罩的显隐。
 */
var loadMarsk = new Ext.LoadMask(document.body,{  
    msg : ''
})
function getMaskEl(type){
	if(type == 'other'){
		//待扩展
	}else{
		loadMarsk.msg = '正在处理中，请稍候......';
	}
	return loadMarsk;
}
</script>
</html>